//UTF-8 encoded
/*
пустое приложение тестирующее загрузку и проверку основных интерфейсов.

*/
#include <QtGui>

#if defined (Q_WS_X11) 
        // Linux :
	/* nothing needs to be included here yet...*/
#elif defined (Q_WS_WIN) 
        // Win :
	#include <windows.h> // for Sleep() :
#elif defined (Q_WS_MAC) 
        // Mac:
	/* NOT SUPPORTED THIS VERSION */
#else
	/* NOT SUPPORTED THIS VERSION */
#endif

/* спать заданное число мили-секунд. Кроссплатформенная версия.*/
inline char Otpd_SleepMS( unsigned int time)
{
	#if defined (Q_WS_X11) 
                // Linux:
                usleep(time*1000);//sleep in millisecinds
	#elif defined (Q_WS_WIN)
                // Win:
                Sleep(time);//WIN  2008.02.19
	#elif defined (Q_WS_MAC)
                // Mac:
                // NOT SUPPORTED THIS VERSION
	#else
                // NOT SUPPORTED THIS VERSION
	#endif
	return 0;
};



// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
	int DebugLevel=4;

	QApplication app(argc, argv);
	QTextEdit     lbl;
//	QString      fname("probe_lib1.so"); 
	QString      fname;
	QLibrary     lib;
	const QString libdirname=".";

	#if defined (Q_WS_X11) 
            // Linux:
            const QString libfilename="qdroid";//LINUX::только имя - без префикса (lib~) и расширения или суффикса "~.so", "~.dll"

	#elif defined (Q_WS_WIN)
            // Win:
            const QString libfilename="libqdroid";//WIN:: имя - c префиксом (lib~) но без расширения или суффикса "~.so", "~.dll"

	#elif defined (Q_WS_MAC)
            // Mac:
            // NOT SUPPORTED THIS VERSION
	#else
            // NOT SUPPORTED THIS VERSION
	#endif

qDebug() << "[1]";
 
        // ++2010

	//"поднамилежащие" системы в suse отдают почему-то русское сообщение и присем в UTF... 
	// приходится декодировать обратно то что рассматривается как latin1 хотя на самом деле utf8 
	QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
	QTextCodec *codec = QTextCodec::codecForName("ISO 8859-1");
	
	fname = QString(""+QApplication::applicationDirPath()+"/"+libdirname+"/"+libfilename);

        lib.setFileName(fname);
        lib.setLoadHints(QLibrary::ExportExternalSymbolsHint|QLibrary::ResolveAllSymbolsHint);

        lbl.append(QString("[0077]: application dir: ["+QApplication::applicationDirPath()+"] \n"));

qDebug() << QString("application dir: ["+QApplication::applicationDirPath()+"] \n");

qDebug() << "[2]";

	// тут скорее всего выдадим отрицательный результат... 
	if (! lib.isLibrary(lib.fileName()))
	    {
                 lbl.append(QString("[0086]: <<lib "+lib.fileName()+" NOT a library::"+QString(codec->fromUnicode(lib.errorString()))+">> \n"));
                 qDebug()<< QString("[0086]: <<lib "+lib.fileName()+" NOT a library::"+QString(codec->fromUnicode(lib.errorString()))+">> \n");
	    }
	   else
	    {
                 lbl.append(QString("[0091]: <<lib "+lib.fileName()+" FOUND as a library::"+QString(codec->fromUnicode(lib.errorString()))+">> \n"));
                 qDebug()<< QString("[0091]: <<lib "+lib.fileName()+" FOUND as a library::"+QString(codec->fromUnicode(lib.errorString()))+ ">> \n");
	    };

qDebug() << "[3]";

	// а тут уже будет подобрано релаьно существующее имя - и значение lib.fileName() изменится. 
	if (! lib.load())
	    {
                 lbl.append("[0100]: <<lib "+lib.fileName()+" NOT loaded:: "+QString(codec->fromUnicode(lib.errorString()))+">> \n");
                 qDebug() << "[0100]: <<lib " << lib.fileName() << " NOT loaded:: " << QString(codec->fromUnicode(lib.errorString())) << ">> \n";
	    }
	   else
	    {
                 lbl.append("[0105]: <<lib "+lib.fileName()+" Loaded:: "+QString(codec->fromUnicode(lib.errorString()))+">>  \n");
                 qDebug() << "[0106]: <<lib "  << lib.fileName()  << " Loaded:: "  <<QString(codec->fromUnicode(lib.errorString()))  << ">>  \n";
	    };

qDebug() << "[4]";

//; 
	if (! lib.isLoaded())
	   {
                  lbl.append("[0114]: <<ERROR : lib not loaded:: "+lib.errorString()+">>  \n");
                  qDebug()  << "[0114]: <<ERROR : lib not loaded:: "  << lib.errorString()  << ">>  \n";
	   }
	  else 
	   {
                  lbl.append("[0119]: <<OK : lib loaded succesfull:: lib filename ["+lib.fileName()+"]>>  \n");
                  qDebug()  << "[0119]: <<OK : lib loaded succesfull:: lib filename ["  << lib.fileName() << "]>>  \n";
	   };

qDebug() << "[5]";


// определим ссылки на наши функции  
/* 
	qint32 init_0(ushort *_ini_file_name); //инициация по описанию ini-файла... 
	qint32 send_0(ushort *_request,ushort * _response_place); //запрос-ответ. За выделение памяти ответственнен вызывающий процесс. 
	qint32 get_status_0(ushort * _response_place); //запрос состояний. За выделение памяти ответственнен вызывающий процесс. 
*/	

        typedef qint32   (*TF_get_counter) (); //инициация по описанию ini-файла...
        typedef QVariant (*TF_init_run) (QStringList );//инициация движка и запуск скрипта
        typedef QString (*TF_setLogFile) (QString );//


/*	typedef qint32 (*T_send_0)(ushort *_request, ushort * _response_place); //запрос-ответ. За выделение памяти ответственнен вызывающий процесс.
	typedef qint32 (*T_get_jobstatus_0)(ushort *_request, ushort * _response_place); //запрос-ответ. За выделение памяти ответственнен вызывающий процесс. 
	typedef qint32 (*T_get_status_0)(ushort * _response_place); //запрос состояний. За выделение памяти ответственнен вызывающий процесс. 
	typedef qint32 (*T_get_int_pp_0)();
//*/

qDebug() << "[6]";

/*	QString Response;
	ushort * _response_place;
	Response.resize(1024);
	_response_place=(ushort *)Response.data();
	QString Request="<phtml>HELLO!<br> 1 <br> 2 <br> 3 <br></phtml>";
	QString WaitedJobId="job_1.0";
//*/
        TF_get_counter	_get_counter 	= (TF_get_counter)(lib.resolve("get_counter"));
        TF_init_run	_init_run 	= (TF_init_run)(lib.resolve("init_run"));
        TF_setLogFile	_setLogFile 	= (TF_setLogFile)(lib.resolve("setLogFile"));


/*	T_get_status_0	get_status_0 	= (T_get_status_0)(lib.resolve("get_status_0"));
	T_get_int_pp_0	get_int_pp_0	= (T_get_int_pp_0)(lib.resolve("get_int_pp_0"));
	T_get_jobstatus_0 get_jobstatus_0 = (T_get_jobstatus_0)(lib.resolve("get_jobstatus_0"));
//*/

qDebug() << "[7]";

        if (_setLogFile)
            {
                lbl.append("OK::<<function _setLogFile resolved>> ");
                if (DebugLevel>=3) qDebug()<<"main.c::0165: OK... function _setLogFile resolved.";

                qDebug()<< "::: _setLogFile()=" << _setLogFile(QApplication::applicationDirPath().append("/libqdroid.app.log"));

            }
                else
            {
                lbl.append("ERROR::<<function _setLogFile not resolved>> \n");
                if (DebugLevel>=1) qDebug()<<"main.c::0170: ERROR...function _setLogFile not resolved";
            };



//	if (DebugLevel>=1) qDebug()<<" ============= get_int_pp_0()="<<get_int_pp_0();
        if (_get_counter)
	    {
                lbl.append("OK::<<function get_counter resolved>> ");
                if (DebugLevel>=3) qDebug()<<"main.c::0165: OK... function get_counter resolved.";

                qDebug()<< "::: _get_counter()=" << _get_counter();
                qDebug()<< "::: _get_counter()=" << _get_counter();
                qDebug()<< "::: _get_counter()=" << _get_counter();

            }
		else
	    {
                lbl.append("ERROR::<<function _get_counter not resolved>> \n");
                if (DebugLevel>=1) qDebug()<<"main.c::0170: ERROR...function _get_counter not resolved";
	    };



        QStringList argList=app.arguments();

        if (_init_run)
	    {
                if (DebugLevel>=3) qDebug()<<"main.c::0179: OK... function init_run resolved";
                lbl.append("OK::<<function init_run resolved>> ");

                qDebug()<< " _init_run(argList) =" << _init_run(argList);

                //lbl.append("<<send() return string:: "+QString::fromUtf16(_response_place)+">>  \n");
                //qDebug()  << "<<send() return string::  "  << QString::fromUtf16(_response_place)  << ">>  \n";
	    }
		else
	    {
                lbl.append("ERROR::<<function init_run not resolved>> \n");
                if (DebugLevel>=1) qDebug()<<"main.c::0188: ERROR... function init_run not resolved";
	    };
	

        //Otpd_SleepMS(5000);//подождем 5 секунд


	lbl.setGeometry (10, 10, 510,310);

	lbl.show();


    return app.exec();
}
